package com.sdonkey.score.dao;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.sdonkey.score.bean.ApplicationNewBean;
import com.sdonkey.score.bean.DeveloperBean;
import com.sdonkey.score.bean.TransferRecordBean;
import com.sdonkey.score.bean.UserBalanceBean;
import com.sdonkey.score.dto.ScoreDetailsDto;
import com.sdonkey.score.dto.UserExtractDto;
import com.sdonkey.score.dto.UserTowardBalanceDto;

/**
 * 广告积分管理Dao
 * @author 赵超
 * @email 773134958@qq.com
 */
public interface IAdScoreManagerDao {
    /**
     * 查看积分
     *
     * @param id
     * @return
     */
    UserBalanceBean selectUserBalance(@Param("id") String id);

    /**
     * 提现记录
     *
     * @param id
     * @return
     */
    List<UserExtractDto> extractRecords(@Param("id") String id);

    /**
     * 按照  日期区间  查询提现记录
     *
     * @param id
     * @param startDate
     * @param endDate
     * @return
     */
    List<UserExtractDto> extractRecordsByDate(@Param("id") String id, @Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 提现记录详情
     *
     * @param id
     * @return
     */
    UserExtractDto selectExtractDetail(@Param("id") String id);

    /**
     * 转账 添加备注
     *
     * @param id
     * @param note
     * @return
     */
    int addNote(@Param("id") String id, @Param("note") String note);

    /**
     * 查询用户的专项积分
     *
     * @param userid
     * @return
     */
    List<UserTowardBalanceDto> selectMyScore(@Param("userid") String userid);

    /**
     * 查询 内容商的产品数量
     *
     * @param developerId
     * @return
     */
    List<UserTowardBalanceDto> selectProductions(@Param("developerId") String developerId);

    /**
     * 获取每个内容商上架的产品类型数量
     *
     * @param dev_id
     * @return
     */
    Integer getProductionMaxApplicationType(@Param("dev_id") String dev_id);

    /**
     * 获取每种类型的产品数量
     *
     * @param type
     * @return
     */
    Integer selectCountByAppType(@Param("type") int type);

    /**
     * 查询单个产品详情
     *
     * @param applicationId
     * @return
     */
    UserTowardBalanceDto selectProductionDetail(@Param("applicationId") String applicationId);

    /**
     * 查询产品价格
     *
     * @param applicationId
     * @return
     */
    Double getPriceBuyAppId(@Param("applicationId") String applicationId);

    /**
     * 新增用户支出记录
     *
     * @param orderId       订单编号（流水号）
     * @param userId        用户id
     * @param applicationId 应用id
     * @param recipientId   收入者id
     * @param recipientName 收入者姓名
     * @param outBalance    转出金额
     * @param outputType    交易类型 如：0：应用充值、1：好友转账、2：应用购买、3：应用充值、4：专项广告
     * @return
     */
    int insertRecord_To_Output(@Param("orderId") String orderId, @Param("userId") String userId, @Param("applicationId") String applicationId,
                               @Param("recipientId") String recipientId, @Param("recipientName") String recipientName, @Param("outBalance") String outBalance, @Param("outputType") String outputType);

    /**
     * 验证支付密码是否正确
     *
     * @param userId
     * @param payPsw 支付密码
     * @return
     */
    int validatePayPsw(@Param("userId") String userId, @Param("payPsw") String payPsw);

    /**
     * 转账给内容商
     *
     * @param developerId
     * @param inBalance   转给内容商的金额
     * @return
     */
    int payToDeveloperExecute(@Param("developerId") String developerId, @Param("inBalance") String inBalance);

    /**
     * 新增转账记录
     *
     * @param orderId          订单编号（流水号）
     * @param userId           用户ID
     * @param recipient_userid 被转账人ID
     * @param recipient_type   被转账人类型（内容商还是普通用户）
     * @param money            转账金额
     * @param transfer_type    转账类型
     * @param note             转账备注
     * @return
     */
    int insertRecord_To_TransferRecords(@Param("orderId") String orderId, @Param("userId") String userId,
                                        @Param("recipient_userid") String recipient_userid, @Param("recipient_type") String recipient_type,
                                        @Param("money") String money, @Param("transfer_type") String transfer_type, @Param("note") String note);

    /**
     * 转账给好友
     *
     * @param friendId  好友的用户id
     * @param inBalance 转给好友的金额
     */
    void payToFriendExecute(@Param("friendId") String friendId, @Param("inBalance") String inBalance);

    /**
     * 查询转账记录
     *
     * @param userId
     * @return
     */
    List<TransferRecordBean> selectTransferRecords(@Param("userId") String userId);

    /**
     * 增加产品 应用 下载次数
     *
     * @param applicationId
     * @return
     */
    int updateAppDownloadTimes(@Param("applicationId") String applicationId);

    /**
     * 新增用户收入记录
     *
     * @param orderId     订单编号（流水号）
     * @param userid
     * @param send_id     转入人id
     * @param send_name   转入人姓名
     * @param price
     * @param income_type 交易类型 如：0：应用充值、1：好友转账、3：应用充值、4：专项广告
     */
    int insertRecord_To_Income(@Param("orderId") String orderId, @Param("userid") String userid, @Param("send_id") String send_id,
                               @Param("send_name") String send_name, @Param("price") String price, @Param("income_type") String income_type);

    /**
     * 查询内容商名称
     *
     * @param developerId 内容商id
     * @return
     */
    String selectDevloperName(@Param("developerId") String developerId);

    /**
     * 查询用户名
     *
     * @param userId
     * @return
     */
    String selectUsername(@Param("userId") String userId);

    /**
     * 通过应用id 查询内容商id
     *
     * @param applicationId 应用id
     * @return
     */
    String selectDevloperId(@Param("applicationId") String applicationId);

    /**
     * 新增内容商交易（转账）记录
     *
     * @param orderid          流水号
     * @param devid            内容商
     * @param recipient_userid 被转账人ID
     * @param recipient_type   被转账人类型
     * @param money            转账金额
     * @param message          转账备注
     * @param transfer_type    转账类型
     * @return
     */
    int insertRecord_To_DevTransfer(@Param("orderid") String orderid, @Param("devid") String devid, @Param("recipient_userid") String recipient_userid,
                                    @Param("recipient_type") String recipient_type, @Param("money") String money, @Param("message") String message, @Param("transfer_type") String transfer_type);

    /**
     * 查询出用户的可用  专项  积分
     *
     * @param id
     * @return 用户的可用专项积分
     */
    String select_TowardBalance(@Param("id") String id);

    /**
     * 修改专项积分
     *
     * @param userId
     * @param outBalance 支出的专项积分
     */
    void update_TowardBalance_Reduce(@Param("userId") String userId, @Param("outBalance") String outBalance);

    /**
     * 查询收入记录
     *
     * @param userId
     * @param paymentType  收支类型
     * @param transferType 交易类型
     * @param startTime
     * @param endTime
     * @param condition    查询标记，condition不为null的时候才会按条件（时间、交易类型）查询
     * @return
     */
    List<ScoreDetailsDto> select_IncomeRecord(@Param("userId") String userId, @Param("paymentType") String paymentType,
                                              @Param("transferType") String transferType, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("condition") String condition);

    /**
     * 查询支出记录
     *
     * @param userId
     * @param paymentType  收支类型
     * @param transferType 交易类型
     * @param startTime
     * @param endTime
     * @param condition    查询标记，condition不为null的时候才会按条件（时间、交易类型）查询
     * @return
     */
    List<ScoreDetailsDto> select_OutputRecord(@Param("userId") String userId, @Param("paymentType") String paymentType,
                                              @Param("transferType") String transferType, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("condition") String condition);

    /**
     * 获取银行卡开户行
     *
     * @param accountId
     * @return
     */
    String getBankName(@Param("accountId") String accountId);

    /**
     * 新增提现记录
     *
     * @param orderId      流水号
     * @param userid       用户id
     * @param accountId    账户id 关联银行卡
     * @param constum_name 名称（安全保障快速到帐）
     * @param account_type 提现类型（快速提现、安全提现）
     * @param target_name  对方名称
     * @param money        提现金额
     * @param service_pay  服务费
     * @param status
     * @return
     */
    int insertRecord_ToExtract(@Param("orderId") String orderId, @Param("userid") String userid, @Param("accountId") String accountId,
                               @Param("constum_name") String constum_name, @Param("account_type") String account_type, @Param("target_name") String target_name,
                               @Param("money") String money, @Param("service_pay") String service_pay, @Param("status") String status);

    /**
     * 加载内容商 应用列表
     *
     * @param developerId
     * @return
     */
    List<ApplicationNewBean> loadDevApp(@Param("developerId") String developerId);

    /**
     * 通过id查询内容商基本信息（毛驴号、名字）
     *
     * @param id
     * @return
     */
    DeveloperBean selectDevInfoById(@Param("id") String id);

    /**
     * 按（不按）条件查询积分消费记录
     *
     * @param userId
     * @param transferType
     * @param startTime
     * @param endTime
     * @param conditionFlag
     * @return
     */
    List<ScoreDetailsDto> selectAllDetail(@Param("userId") String userId, @Param("transferType") String transferType, @Param("startTime") String startTime,
                                          @Param("endTime") String endTime, @Param("conditionFlag") String conditionFlag);

    /**
     * 通过id查询 以关注内容商信息
     *
     * @param userId
     * @return
     */
    List<DeveloperBean> devListById(@Param("userId") String userId);

    /**
     * 提现失败之后向用户的账户里面增加相应的提现金额
     *
     * @param userId
     * @param outBalance
     * @return
     */
    int transferToBankFailed(@Param("userId") String userId, @Param("outBalance") String outBalance);

    /**
     * 按id查询应用信息
     *
     * @param appId
     * @return
     */
    ApplicationNewBean selectAppInfoByAid(String appId);

    /**
     * 按输入信息 查询内容商id集合
     * @param condition
     * @return
     */
    List<String> selectDevIdsByCondition(String condition);
    /**
     * 按条件查询应用列表
     *
     * @param userId
     * @param condition
     * @return
     */
    List<ApplicationNewBean> searchAppByCondition(@Param("userId") String userId, @Param("condition") String condition);

    /**
     * 查询用户的可用专项积分
     *
     * @param userId
     * @param appId
     * @return
     */
    Double getTowardBalanceByAppId(@Param("userId") String userId, @Param("appId") String appId);
}
